package com.qianfeng.zhangwei.day26.utils;

import android.content.Context;
import android.graphics.Bitmap;
import android.os.Build;
import android.os.Handler;
import android.os.Message;
import android.support.v4.util.LruCache;
import android.widget.ImageView;

import com.qianfeng.zhangwei.day26.R;

import java.io.IOException;
import java.lang.ref.SoftReference;
import java.util.HashMap;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;


/**
 * @说 明：
 * @项目名称：Sz1504
 * @包 名： com.qianfeng.zhangwei.day28.utils
 * @类 名： AsyncImageLoader
 * @创 建人： zhangwei
 * @创建时间：2015-07-23 10:34
 * @版 本：v1.0
 * @修 改人：
 * @修改时间：
 * @修改备注： imageView + url
 *
 * 图片产生的根本原因
 * convertview 的复用 且有异步下载
 *
 * 磁盘缓存  File  执行文件缓存  --指定保存的路径
 * 内存    Lrucache --- >>> 防止图片内存溢出  --   分配可用内存  32m;
 * 线程池  管理下载图片的线程
 *
 */
public class AsyncImageLoader {
    private static AsyncImageLoader loader;
    private static LruCache<String, Bitmap> lruCache;
    private FileUtils fileUtils;
    private static Context context;
    private ThreadPoolExecutor poolExecutor;
    private LinkedBlockingQueue<Runnable> queue;
    /**
     * @param context
     */
    public static void init(Context context) {
        AsyncImageLoader.context = context;
    }

    /**
     * jvm倾向于对软引用和弱引用的\回收 所以软引用就变的不可靠
     */
    private SoftReference<HashMap<String, Bitmap>> softReference;


    private AsyncImageLoader() {
        fileUtils = new FileUtils(context);
        queue = new LinkedBlockingQueue<>(10);
        poolExecutor = new ThreadPoolExecutor(4,5,1000, TimeUnit.MILLISECONDS,queue);
                lruCache = new LruCache<String, Bitmap>(4 * 1204 * 1024) {
            @Override
            protected void entryRemoved(boolean evicted, String key, Bitmap oldValue, Bitmap newValue) {
                super.entryRemoved(evicted, key, oldValue, newValue);
            }

            @Override
            protected int sizeOf(String key, Bitmap value) {
                return getBitmapSize(value);
            }
        };


    }


    public static AsyncImageLoader getInstance() {
        if (loader == null) {
            loader = new AsyncImageLoader();
        }
        return loader;
    }

    /**
     * @param url
     * @param imageView 第一种情况假设第一项图片下载成功 复用的第九项没下载来
     *                  第二种情况 假设第一项图片没下载成功 ,而屏幕滑动到第九项,第九项的图片的下载成功  又滑回第一项
     *
     *
     *
     *                  缓存的三种方式
     *                  内存缓存
     *                  磁盘缓存
     *                  网络缓存
     *
     *                  加载图片的方案
     *                  1> 速度 + 内存最快   小
     *                  2> 磁盘缓存  速度一般   空间大
     *                  3> 才开线程去下载图
     */
    public void loadImage(final String url, final ImageView imageView) {
        Bitmap bitmap = lruCache.get(url);

        if (bitmap != null) {
            imageView.setImageBitmap(bitmap);
        } else {
            final Handler handler = new Handler() {
                @Override
                public void handleMessage(Message msg) {
                    super.handleMessage(msg);
                    switch (msg.what) {
                        case 0:
                            Bitmap bitmap = (Bitmap) msg.obj;
                            if (url.equals((String) imageView.getTag())) {
                                imageView.setImageBitmap(bitmap);
                            }
                            break;
                        case 1:
                            imageView.setImageResource(R.mipmap.ic_launcher);
                            break;
                    }

                }
            };

//        imageView.setImageResource(R.mipmap.ic_launcher);

            poolExecutor.execute(new Runnable() {
                @Override
                public void run() {
                    Message msg = handler.obtainMessage();
                    //通过url下载图片
                    Bitmap bitmap = fileUtils.getBitmap(url);
                    if (bitmap == null) {
                        bitmap = HttpUtils.getBitmap(url);
                        msg.what = 0;
                        msg.obj = bitmap;
                        if (bitmap != null) {
                            try {
                                lruCache.put(url, bitmap);
                                fileUtils.savaBitmap(url, bitmap);
                            } catch (IOException e) {
                                e.printStackTrace();
                                msg.what = 2;
                            }
                        }
                    } else {
                        msg.what = 0;
                        msg.obj = bitmap;
                        lruCache.put(url, bitmap);
                    }
                    handler.sendMessage(msg);
                }
            });
        }

    }


    private int getBitmapSize(Bitmap bitmap) {
        int size = 0;
        if (Build.VERSION.SDK_INT > Build.VERSION_CODES.HONEYCOMB_MR1) {
            size = bitmap.getByteCount();
        } else {
            size = bitmap.getRowBytes() * bitmap.getHeight();
        }
        return size;
    }


}
